"use strict";
/**
 * @author luzhenfang
 * @date 2020 04 27
 * @description ts 面向对象编程
 *  使用 class 关键字创建 类
 *      统一构造函数为 constructor 不需要返回值
 *      成员变量定义在类中，并声明好类型
 *  继承：
 *      ts 只支持 单继承
 *      要继承的类必须存在
 *      使用  extends 关键字
 * 重写：
 *     子类可以重写父类方法
 *      super 关键字是父类的直接引用
 * static：
 *      用于定义类的数据成员（属性和方法） 为 静态的 ，静态成员可以直接通过类名调用。
 * instanceof ：
 *      用于判断 对象是否 是指定类型
 * 访问修饰符：
 *      public  公有  任何地方都可以被访问
 *      protected 受保护 可以被自身以及其子类 父类访问
 *      private 私有 只能被其定义所在的类访问
 * interface:
 *      类接口 用来规范类
 * implements:
 *      当一个类实现该接口时 使用 此关键字
 *
 */
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
var City = /** @class */ (function () {
    function City(cName, cLevel) {
        this.cName = cName;
        this.cLevel = cLevel;
    }
    City.prototype.about = function () {
        console.log("\u5144\u5F97\uFF0C\u4F60\u8DF3" + this.cName + "~\u5371\u9669\u7CFB\u6570\u4E3A\uFF1A" + this.cLevel + " \u5FEB\u8DD1\u5427\uFF01\uFF01\uFF01");
    };
    return City;
}());
;
var city1 = new City("自闭城", 5);
var city2 = new City("G港", 4);
var city3 = new City("P城", 3);
city1.about();
city2.about();
city3.about();
// 基类
var Shape = /** @class */ (function () {
    function Shape(area) {
        this.area = area;
    }
    Shape.prototype.display = function () {
        console.log(this.area);
    };
    Shape.hello = "我是基类";
    return Shape;
}());
// 类 继承
var Circle = /** @class */ (function (_super) {
    __extends(Circle, _super);
    function Circle() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    // 方法重写
    Circle.prototype.display = function () {
        // 直接引用父类
        _super.prototype.display.call(this);
        console.log("子类也有。。");
    };
    return Circle;
}(Shape));
var obj = new Circle(10);
// 类变量
console.log(Shape.hello);
obj.display();
// 实现 接口
var Person = /** @class */ (function () {
    function Person(name) {
        this.sName = name;
    }
    Person.prototype.display = function () {
        console.log(this.sName);
    };
    return Person;
}());
var p1 = new Person("小明");
p1.display();
